package com.itcam.reflect;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

/**
 * @author : Cammy.Wu
 * Description : 获取类的信息
 */

public class Test08 {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, NoSuchMethodException {
        Class<?> c1 = Class.forName("com.itcam.reflect.User");

        // 获取类的名字
        System.out.println(c1.getName()); // 获得包名 + 类名
        System.out.println(c1.getSimpleName()); // 获得类名

        System.out.println("======================");
        // 获取类的属性
        Field[] fields = c1.getFields(); // 只能找到public属性
        for (Field field : fields) {
            System.out.println(field);
        }
        System.out.println("======================");
        Field[] declaredFields = c1.getDeclaredFields(); // 获取所有属性
        for (Field declaredField : declaredFields) {
            System.out.println(declaredField);
        }

        // 获取指定属性的值
        Field name = c1.getDeclaredField("name");
        System.out.println("name = " + name);

        System.out.println("======================");
        // 获取类的方法
        Method[] methods = c1.getMethods(); // 获取本类及其父类的全部public方法
        for (Method method : methods) {
            System.out.println("method = " + method);
        }
        Method[] declaredMethods = c1.getDeclaredMethods(); // 获取本类的所有方法
        for (Method declaredMethod : declaredMethods) {
            System.out.println("declaredMethod = " + declaredMethod);
        }

        // 获得指定的方法
        Method getName = c1.getMethod("getName", null);
        Method setName = c1.getMethod("setName", String.class);
        System.out.println("getName = " + getName);
        System.out.println("setName = " + setName);

        System.out.println("======================");
        // 获得类的构造器
        Constructor<?>[] constructors = c1.getConstructors();
        for (Constructor<?> constructor : constructors) {
            System.out.println("constructor = " + constructor);
        }
        Constructor<?>[] declaredConstructors = c1.getDeclaredConstructors();
        for (Constructor<?> declaredConstructor : declaredConstructors) {
            System.out.println("declaredConstructor = " + declaredConstructor);
        }

        // 获取指定的构造器
        Constructor<?> declaredConstructor = c1.getDeclaredConstructor(int.class, String.class, int.class);
        System.out.println("declaredConstructor = " + declaredConstructor);
    }

}
